# -*- coding: utf-8 -*-
import webapp2
from webapp2_extras import sessions
import os
import datetime
import re
import jinja2
   
class BaseHandler(webapp2.RequestHandler):
    '''
    Una clase de la cual tienen que heredar todos los request que quieran
    tener soporte de sesiones.
    Al crearse se inicia un diccionario en el que siempre figurará el año
    actual y el nombre del usuario registrado en caso que esté.
    '''
    def __init__(self, request, response):
        self.initialize(request, response)
        self.d = {}
        self.d['b_anyo'] = datetime.datetime.now().year
        self.d['b_pagina'] = "geopolvazo.appspot.com"
                    
    def inicio(self):
        user_name = self.session.get('user_name')
        if user_name:
            self.d['b_user_name'] = user_name
            self.d['b_is_admin'] = self.session.get('is_admin')
        
    def esta_logueado(self):
        if self.session.get('user_name'):
            return True
        
    def es_admin(self):
        return self.session.get('is_admin')
            
    def dispatch(self):
        # Get a session store for this request.
        self.session_store = sessions.get_store(request=self.request)
        try:
            webapp2.RequestHandler.dispatch(self)
        finally:
            self.session_store.save_sessions(self.response)
    
    @webapp2.cached_property
    def session(self):
        return self.session_store.get_session()
    
    @classmethod
    def string_to_int(cls, s, i_min, i_max, default = 0):
        '''
        Convierte una cadena con la representación de un entero a un entero
        que debe estar comprendido entre el minimo y el máximo (inclusive).
        Si hay un error, se devuelve el valor por defecto.
        '''
        try:
            i = int(s)
            if i >= i_min and i <= i_max:
                return i
            else:
                return default
        except exceptions.ValueError:
            return default
    
    @classmethod
    def render(cls, template, **params):
        '''
        Renderiza los templates con los parametros que se le pasen un un
        diccionario y devuelve la cadena de texto.
        '''
        #return os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'templates'))
        return jinja2.Environment(loader = jinja2.FileSystemLoader(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'templates'))), autoescape = False).get_template(template).render(params)
    
    def render_and_write_404(self):
        '''
        Renderiza y envia una respuesta http con codigo 404 de la plantilla
        404.html
        '''
        self.response.set_status(404)
        self.response.write(self.render('404.html', **self.d))
    
    @classmethod
    def comprueba_mail(cls, m):
        if m and re.compile(r'^[\S]+@[\S]+\.[\S]+$').match(m):
            return True
    
    @classmethod
    def comprueba_username(cls, u):
        if u and re.compile(r"^[a-zA-Z0-9_]{3,20}$").match(u):
            return True
    
    @classmethod
    def comprueba_password(cls, p):
        if p and re.compile(r"^.{8,20}$").match(p):
            return True
